package com.minio.learning.config;

/**
 * MinIO 配置类
 * 
 * 作用：
 * 1. 集中管理 MinIO 连接配置
 * 2. 便于在不同环境切换（开发/测试/生产）
 * 3. 避免在代码中硬编码敏感信息
 * 
 * 为什么要这样设计？
 * - 单一职责原则：配置信息统一管理
 * - 方便维护：修改配置只需改一个地方
 * - 安全性：生产环境可以从环境变量或配置中心读取
 */
public class MinioConfig {
    
    /**
     * MinIO 服务器地址
     * 格式：host:port 或 http://host:port
     * 
     * 开发环境：localhost:9000
     * 生产环境：minio.example.com:9000 或使用域名
     */
    private static final String ENDPOINT = "localhost:9000";
    
    /**
     * 访问密钥（Access Key）
     * 类似于用户名，用于身份识别
     * 
     * 安全提示：
     * - 生产环境不要硬编码，使用环境变量
     * - 不要提交到代码仓库
     */
    private static final String ACCESS_KEY = "admin";
    
    /**
     * 密钥（Secret Key）
     * 类似于密码，用于身份验证
     * 
     * 安全提示：
     * - 必须保密
     * - 定期更换
     */
    private static final String SECRET_KEY = "12345678";
    
    /**
     * 是否使用 HTTPS
     * 
     * false：使用 HTTP（开发环境）
     * true：使用 HTTPS（生产环境必须）
     */
    private static final boolean SECURE = false;
    
    /**
     * 默认桶名称
     * 用于示例代码和测试
     * 
     * 命名规则：
     * - 只能包含小写字母、数字、连字符
     * - 长度 3-63 个字符
     * - 不能以连字符开头或结尾
     */
    private static final String DEFAULT_BUCKET = "test-bucket";
    
    // ==================== Getter 方法 ====================
    
    public static String getEndpoint() {
        // 优先从环境变量读取（生产环境推荐）
        String endpoint = System.getenv("MINIO_ENDPOINT");
        return endpoint != null ? endpoint : ENDPOINT;
    }
    
    public static String getAccessKey() {
        String accessKey = System.getenv("MINIO_ACCESS_KEY");
        return accessKey != null ? accessKey : ACCESS_KEY;
    }
    
    public static String getSecretKey() {
        String secretKey = System.getenv("MINIO_SECRET_KEY");
        return secretKey != null ? secretKey : SECRET_KEY;
    }
    
    public static boolean isSecure() {
        String secure = System.getenv("MINIO_SECURE");
        return secure != null ? Boolean.parseBoolean(secure) : SECURE;
    }
    
    public static String getDefaultBucket() {
        return DEFAULT_BUCKET;
    }
    
    /**
     * 打印当前配置（用于调试）
     * 注意：不会打印完整的密钥，只显示前几位
     */
    public static void printConfig() {
        System.out.println("====== MinIO 配置信息 ======");
        System.out.println("Endpoint: " + getEndpoint());
        System.out.println("Access Key: " + maskSecret(getAccessKey()));
        System.out.println("Secret Key: " + maskSecret(getSecretKey()));
        System.out.println("Secure (HTTPS): " + isSecure());
        System.out.println("Default Bucket: " + getDefaultBucket());
        System.out.println("===========================");
    }
    
    /**
     * 隐藏密钥显示（安全措施）
     */
    private static String maskSecret(String secret) {
        if (secret == null || secret.length() <= 4) {
            return "****";
        }
        return secret.substring(0, 3) + "****" + secret.substring(secret.length() - 1);
    }
}

